import type { PageResult } from './permission';

import { requestClient } from '#/api/request';

/**
 * 角色数据结构
 */
export interface Role {
  id?: number;
  roleCode: string;
  roleName?: string;
  description?: string;
  status?: number;
  createBy?: string;
  updateBy?: string;
  createTime?: string;
  updateTime?: string;
  createName?: string;
  updateName?: string;
  permissionIds?: number[];
}

/**
 * 角色查询参数
 */
export interface RoleQueryParams {
  roleCode?: string;
  roleName?: string;
  status?: number;
  pageNum?: number;
  pageSize?: number;
}

/**
 * 获取角色列表（分页）
 */
export async function getRoleListApi(params: RoleQueryParams) {
  return requestClient.post<PageResult<Role>>('/system/api/role/page', params);
}

/**
 * 获取所有角色（不分页）
 */
export async function getAllRolesApi() {
  return requestClient.get<Role[]>('/system/api/role/list');
}

/**
 * 获取角色详情
 */
export async function getRoleDetailApi(id: number) {
  return requestClient.get<Role>(`/system/api/role/${id}`);
}

/**
 * 新增角色
 */
export async function addRoleApi(data: Role) {
  return requestClient.post('/system/api/role/add', data);
}

/**
 * 编辑角色
 */
export async function updateRoleApi(data: Role) {
  return requestClient.put('/system/api/role/edit', data);
}

/**
 * 删除角色
 */
export async function deleteRoleApi(id: number) {
  return requestClient.delete(`/system/api/role/delete/${id}`);
}
/**
 * 分配角色菜单权限（菜单ID包含目录、菜单、按钮）
 */
export async function assignRoleMenusApi(roleId: number, menuIdList: number[]) {
  return requestClient.post(`/system/api/roleMenu/assignRoleMenus`, {
    roleId,
    menuIdList,
  });
}

/**
 * 角色菜单树节点（用于分配权限）
 */
export interface RoleMenuTreeNode {
  /** 菜单ID */
  id: number;
  /** 父菜单ID */
  parentId: number;
  /** 菜单名称 */
  menuName: string;
  /** 菜单类型（1-目录，2-菜单，3-按钮） */
  menuType: number;
  /** 权限编码 */
  permissionCode?: string;
  /** 排序号 */
  sort?: number;
  /** 是否勾选（当前角色是否拥有该菜单权限） */
  checked: boolean;
  /** 子菜单列表 */
  children?: RoleMenuTreeNode[];
}

/**
 * 获取角色分配权限的菜单树（包含当前角色已有权限的勾选状态）
 */
export async function getRoleMenuTree(roleId?: number) {
  return requestClient.get<RoleMenuTreeNode[]>(
    '/system/api/roleMenu/getRoleMenuTree',
    {
      params: roleId ? { roleId } : {},
    },
  );
}
